package cc.rengu.igas.share.core.realize;

import cc.rengu.igas.share.core.model.*;
import cc.rengu.oltp.service.common.entity.MchntOrderInfo;
import cc.rengu.oltp.service.common.enums.LimitAcctTypeEnum;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.service.model.TransLimitInfo;

import java.util.List;

/**
 * 商户相关组件服务
 * Created by wangcheng on 2021/5/25
 */
public interface MchntService {

    /**
     * 平台商户合法性检查
     *
     * @param instId      多法人标识
     * @param platMchntNo 平台商户号
     * @return true-合法，false-不合法
     * @throws Exception 异常
     */
    boolean checkPlatMchntStatus(String instId, String platMchntNo) throws Exception;

    /**
     * 获取平台商户信息
     *
     * @param instId      多法人标识
     * @param platMchntNo 平台商户号
     * @return 平台商户信息
     * @throws Exception 异常
     */
    PlatMchntInfo getPlatMchntInfo(String instId, String platMchntNo) throws Exception;

    /**
     * 代理商合法性检查
     *
     * @param instId       多法人标识
     * @param agentMchntNo 代理商商户号
     * @return true-合法，false-不合法
     * @throws Exception 异常
     */
    boolean checkAgentMchntStatus(String instId, String agentMchntNo) throws Exception;

    /**
     * 获取代理商商户信息
     *
     * @param instId       多法人标识
     * @param agentMchntNo 代理商商户号
     * @return 代理商商户信息
     * @throws Exception 异常
     */
    AgentMchntInfo getAgentMchntInfo(String instId, String agentMchntNo) throws Exception;

    /**
     * 集团商合法性检查
     *
     * @param instId       多法人标识
     * @param groupMchntNo 集团商商户号
     * @return true-合法，false-不合法
     * @throws Exception 异常
     */
    boolean checkGroupMchntStatus(String instId, String groupMchntNo) throws Exception;

    /**
     * 获取集团商商户信息
     *
     * @param instId       多法人标识
     * @param groupMchntNo 集团商商户号
     * @return 集团商商户信息
     * @throws Exception 异常
     */
    GroupMchntInfo getGroupMchntInfo(String instId, String groupMchntNo) throws Exception;

    /**
     * 商户合法性检查
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @return true-合法，false-不合法
     * @throws Exception 异常
     */
    boolean checkMchntStatus(String instId, String mchntNo) throws Exception;

    /**
     * 获取商户信息
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @return 商户信息
     * @throws Exception 异常
     */
    MchntInfo getMchntInfo(String instId, String mchntNo) throws Exception;

    /**
     * 获取商户基本信息及签约信息
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @return 商户信息
     * @throws Exception 异常
     */
    MchntInfo getMchntSignInfo(String instId, String mchntNo) throws Exception;

    /**
     * 获取商户或者终端的所有权限列表信息
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @param termNo  终端号
     * @return 商户或者终端权限列表
     */
    List<MchntAuthInfo> getMchntAuthInfo(String instId, String mchntNo, String termNo) throws Exception;

    /**
     * 获取商户或者终端的某支交易权限列表
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @param termNo  终端号
     * @param txnNum  内部交易码
     * @param bizType 精细细分
     * @return 商户或者终端某支交易的权限列表
     * @throws Exception 异常
     */
    List<MchntAuthInfo> getMchntAuthInfo(String instId, String mchntNo, String termNo, String txnNum, String bizType) throws Exception;

    /**
     * 商户交易权限检查
     *
     * @param instId   多法人标识
     * @param mchntNo  商户号
     * @param termNo   终端号
     * @param txnNum   内部交易码
     * @param bizType  业务细分
     * @param acctType 账户类型
     * @return true-合法，false-不合法
     * @throws Exception 异常
     */
    boolean checkMchntAuth(String instId, String mchntNo, String termNo, String txnNum, String bizType, String acctType) throws Exception;

    /**
     * 获取商户交易限额配置信息
     * @param instId 多法人标识
     * @param mchntNo 商户号
     * @param termNo 终端号
     * @param txnNum 交易码
     * @return 商户交易限额配置信息
     * @throws BizException 异常
     */
    List<TransLimitInfo> getMchntTransLimitInfo(String instId,String mchntNo,String termNo,String txnNum) throws Exception;

    /**
     * 商户限额检查
     *
     * @param instId        多法人标识
     * @param transAmt      交易金额
     * @param limitAcctType 限额账户类型
     * @param mchntNo       商户号
     * @param termNo        终端号
     * @param txnNum        交易码
     * @return 0-限额检查通过，1-贷记限额超限，2-借记限额超限，3-累计限额超限
     */
    int checkMchntTransLimit(String instId, String transAmt, LimitAcctTypeEnum limitAcctType, String mchntNo, String termNo, String txnNum) throws Exception;

    /**
     * 更新商户累计限额数据
     *
     * @param mchntOrderInfoList 商户订单列表
     */
    void updateMchntTransLimit(List<MchntOrderInfo> mchntOrderInfoList) throws Exception;

    /**
     * 更新商户累计限额数据
     *
     * @param mchntOrderInfo 商户订单信息
     */
    void updateMchntTransLimit(MchntOrderInfo mchntOrderInfo);

    /**
     * 商户退款限额检查，当天累计收款金额必须大于累计退款金额,本行卡退款只校验本行卡累计，非本行卡卡校验所有支付累计
     *
     * @param instId    机构号
     * @param mchntNo   商户号
     * @param refundAmt 退款金额
     * @throws Exception 异常
     */
    boolean checkMchntRefundLimit(String instId, String mchntNo, String refundAmt) throws Exception;

    /**
     * 获取商户产品列表信息
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @return 商户产品列表信息
     * @throws Exception 异常
     */
    List<MchntProdInfo> getMchntProdInfo(String instId, String mchntNo) throws Exception;

    /**
     * 获取商户分期产品信息
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @return 商户分期产品信息
     * @throws Exception 异常
     */
    List<MchntStageInfo> getMchntStageInfo(String instId, String mchntNo) throws Exception;

    /**
     * 获取商户结算账户信息
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @return 商户结算账户信息列表
     * @throws Exception 异常
     */
    List<MchntAcctInfo> getMchntAcctInfo(String instId, String mchntNo) throws Exception;

    /**
     * 获取商户费率信息
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @return 商户费率信息列表
     * @throws Exception 异常
     */
    List<MchntFeeInfo> getMchntFeeInfo(String instId, String mchntNo) throws Exception;

    /**
     * 获取实时清算标志：非担保、不参与营销、开通本行实时清算并且为本行卡交易、或清算方式为D0并且结算账户为本行账户
     * 商户清算本金大于配置金额才d0入账
     *
     * @param mchntNo       商户号
     * @param bizProdCode   业务产品代码
     * @param bizScene      业务场景代码
     * @param realSettleAmt 商户实际清算本金
     * @return Y-实时清算；N-非实时
     * @throws Exception 异常
     */
    String getRealSettleFlag(String mchntNo, String bizProdCode, String bizScene, String realSettleAmt) throws Exception;

    /**
     * 获取商户密钥配置信息
     *
     * @param instId     多法人标识
     * @param mchntNo    商户号
     * @param mchntAppId 商户应用标识
     * @param keyType    密钥类型
     * @return 商户密钥信息
     * @throws Exception 异常
     */
    MchntKeyInfo getMchntKeyInfo(String instId, String mchntNo, String mchntAppId, String keyType) throws Exception;

    /**
     * 获取商户终端信息
     *
     * @param instId  多法人标识
     * @param mchntNo 商户号
     * @param termNo  终端号
     * @return 商户终端信息
     * @throws Exception 异常
     */
    MchntTermInfo getMchntTermInfo(String instId, String mchntNo, String termNo) throws Exception;

    /**
     * 更新商户终端信息
     *
     * @param oprType  更新类型：A0-更新经纬度，00-批次号，01-签到状态，02-IC参数下载状态，03-公钥下载状态
     * @param termInfo 终端信息
     * @return true-更新成功,false-更新失败
     * @throws Exception 异常
     */
    boolean updateMchntTermInfo(String oprType, MchntTermInfo termInfo) throws Exception;

    /**
     * 计算商户手续费
     *
     * @param mchntOrderInfoList 商户订单信息
     * @param feeType            费率类型
     * @return 商户手续费计算结果, true-计算成功，false-计算失败
     * @throws Exception 异常
     */
    boolean calcMchntFee(List<MchntOrderInfo> mchntOrderInfoList, String feeType) throws Exception;

    /**
     * 计算商户手续费
     *
     * @param mchntOrderInfo 商户订单信息
     * @param feeType        费率类型
     * @return 商户手续费计算结果, true-计算成功，false-计算失败
     * @throws Exception 异常
     */
    boolean calcMchntFee(MchntOrderInfo mchntOrderInfo, String feeType) throws Exception;

    /**
     * 计算商户退款手续费
     *
     * @param refundMchntOrderInfo 退款商户订单信息
     * @param origMchntOrderInfo   原商户订单信息
     * @return true-计算成功，false-计算失败
     * @throws Exception 异常
     */
    boolean calcMchntRefundFee(MchntOrderInfo refundMchntOrderInfo, MchntOrderInfo origMchntOrderInfo) throws Exception;
}
